const dayjs = require('dayjs')
const ms = require('ms')

/**
 * 微信授权验证
 * https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
 */
module.exports = (options) => {
  options = {
    // ignoreUrl: [],
    // interceptUrl: ['/'], // 默认拦截所有
    ...options,
  }

  const { ignoreUrl, interceptUrl, developer, systemAuth, isLocal, callbackUrl, expireIn } = options

  return async (ctx, next) => {
    // if (skipAuth(ignoreUrl, interceptUrl, url)) {
    //   console.log('调过授权')
    //   return await next()
    // }

    // 已授权
    if (ctx.session.wechat) {
      return await next()
    } else {
      console.log('[微信] 需要授权')
    }

    // 未授权
    // 开发环境和调试模式
    if (ctx.debug || (isLocal && !isWeiXin(ctx))) {
      console.log(`[微信] 开发者账号`)

      // 微信授权开发者模式
      const expire = dayjs().add(ms(expireIn), 'ms')
      ctx.session.wechat = {
        ...developer,
        _expire: expire.unix(),
        _expireFormat: expire.format('YYYY-MM-DD HH:mm:ss'),
      }

      await next()
      return
    }

    const urlEncode = encodeURIComponent(ctx.url)

    // 到指定系统授权
    if (systemAuth) {
      const callbackUrl = encodeURIComponent(systemCallbackUrl + `?url=${urlEncode}`)
      ctx.redirect(`${systemAuth}?url=${callbackUrl}`)
    }
    // 微信网页授权
    else {
      const { scope, appId } = options
      const redirecUri = encodeURIComponent(callbackUrl + `?url=${urlEncode}`)
      ctx.redirect(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirecUri}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`)
    }
  }
}

/**
 * 判断是否跳过授权(url没有被拦截或过滤时)
 * @param {*} ignoreUrl
 * @param {*} interceptUrl
 * @param {*} url
 */
function skipAuth(ignoreUrl, interceptUrl, url) {
  // 判断URL是否过滤
  if (ignoreUrl && ignoreUrl.length) {
    const ret = urlMatch(ignoreUrl, url)

    // 匹配到拦截url
    if (ret) return true
  }

  // 判断URL是否拦截
  if (interceptUrl && interceptUrl.length) {
    const ret = urlMatch(interceptUrl, url)

    // 没有匹配到拦截url
    if (!ret) return true
  }
}

/**
 * URL匹配
 */
function urlMatch(urls, url) {
  // 过滤
  if (urls && urls.length) {
    const ret = urls.some((val) => {
      return url.indexOf(val) == 0
    })

    return ret ? true : false
  }
}

/**
 * 判断是否再微信中访问
 * @Author gyllz@live.com
 * @date   2015-11-23
 * @return {Boolean} True 或者 False
 */
function isWeiXin(ctx) {
  let ua = ctx.headers['user-agent']
  // let host = ctx.headers['host'];

  if (ua && ua.match(/MicroMessenger/i) == 'MicroMessenger') {
    console.log('[微信授权] 微信中访问')
    return true
  } else {
    console.log('[微信授权] 非微信访问')
    return false
  }
}

// 微信表情过滤
// http://www.jianshu.com/p/92dbc1e52041
function emoji2Str(str) {
  return unescape(escape(str).replace(/\%uD.{3}/g, ''))
}
